package org.sintec.AndroidCarConnectivity;

import org.sintec.AndroidCarConnectivity.activityDeviceList;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

public class activityMain extends Activity 
{
	protected static final int REQUEST_CONNECT_DEVICE = 0;
	//private serviceConnectivity mBoundService;
	//private boolean mIsBound = false;
	
	private String mBtAddress = "";
	private int mSocketPort = 7777;
	private int mHttpPort = 8888;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name"));
    }
        
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
    	if (requestCode == REQUEST_CONNECT_DEVICE)
    	{
    		if (resultCode == RESULT_OK)
    		{
                String address = data.getStringExtra(activityDeviceList.EXTRA_DEVICE_ADDRESS);
             
    			Toast.makeText(this, address, Toast.LENGTH_SHORT).show();
    		}
    	}
    }
    
    // Working with service stuff
    /*
    private ServiceConnection mConnection = new ServiceConnection()
    {
        public void onServiceConnected(ComponentName className, IBinder service)
        {
            // This is called when the connection with the service has been
            // established, giving us the service object we can use to
            // interact with the service.  Because we have bound to a explicit
            // service that we know is running in our own process, we can
            // cast its IBinder to a concrete class and directly access it.
            mBoundService = ((serviceConnectivity.ConnectivityBinder)service).getService();

            // Tell the user about this for our demo.
            Toast.makeText(activityMain.this, R.string.title_service_connected,
                    Toast.LENGTH_SHORT).show();
        }

        public void onServiceDisconnected(ComponentName className) {
            // This is called when the connection with the service has been
            // unexpectedly disconnected -- that is, its process crashed.
            // Because it is running in our same process, we should never
            // see this happen.
            mBoundService = null;
            Toast.makeText(activityMain.this, R.string.title_service_disconnected,
                    Toast.LENGTH_SHORT).show();
        }
    };
    */

    /*
    void doBindService()
    {
        // Establish a connection with the service.  We use an explicit
        // class name because we want a specific service implementation that
        // we know will be running in our own process (and thus won't be
        // supporting component replacement by other applications).
        Intent startIntent = new Intent(activityMain.this, serviceConnectivity.class);
        startIntent.putExtra("btAddress", mBtAddress);
        startIntent.putExtra("socketPort", mSocketPort);
        startIntent.putExtra("httpPort", mHttpPort);
        
    	bindService(startIntent, mConnection, Context.BIND_AUTO_CREATE);
        mIsBound  = true;
    }
    */

    /*
    void doUnbindService()
    {
        if (mIsBound)
        {
            // Detach our existing connection.
            unbindService(mConnection);
            mIsBound = false;
        }
    }
    */
    
    @Override
    protected void onStart()
    {
    	super.onStart();
    	updateGUIPreferencesView();
    }
    
    @Override
    protected void onResume()
    {
    	super.onResume();
    	updateGUIPreferencesView();
    }
    
    private void updateGUIPreferencesView()
    {
    	getPrefs();
    	
    	TextView tSocket = (TextView) findViewById(R.id.lblStatusValueSocket);
    	String socketPort = new Integer(mSocketPort).toString();
    	tSocket.setText(socketPort);
    	
    	TextView tBt = (TextView) findViewById(R.id.lblStatusValueBluetooth);
    	tBt.setText("" + mBtAddress);
    	
    	TextView tHttp = (TextView) findViewById(R.id.lblStatusValueHttp);
    	String httpPort = new Integer(mHttpPort).toString();
    	tHttp.setText(httpPort);
    }
    
    @Override
    protected void onDestroy()
    {
    	unregisterReceiver(mMessageReceiver);
        //doUnbindService();
        
    	super.onDestroy();
    }
    
    private void getPrefs()
    {
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
        
    	mBtAddress = prefs.getString("pref_bluetooth_address", "");
    	mSocketPort = new Integer(prefs.getString("pref_socket_port", "7777"));
    	mHttpPort = new Integer(prefs.getString("pref_http_port","8888"));
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        // Handle item selection
        switch (item.getItemId())
        {
            case R.id.mnuPreferences:
            	Intent settingsActivity = new Intent(getBaseContext(), activityPreferences.class);
                startActivity(settingsActivity);
                
                return true;
            case R.id.mnuStartService:
                Intent startIntent = new Intent(activityMain.this, serviceConnectivity.class);
                startIntent.putExtra("btAddress", mBtAddress);
                startIntent.putExtra("socketPort", mSocketPort);
                startIntent.putExtra("httpPort", mHttpPort);
                
            	startService(startIntent);
                
                return true;
            case R.id.mnuStopService:
            	stopService(new Intent (activityMain.this, serviceConnectivity.class));
                
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    
    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver()
    {
		@Override
		public void onReceive(Context context, Intent intent)
		{
			// Get extra data included in the Intent
			String ipAddress = intent.getStringExtra("localIpAddress");
			String statusBt = intent.getStringExtra("statusBt");
			String statusSocket = intent.getStringExtra("statusSocket");
			String statusHttp = intent.getStringExtra("statusHttp");
			
			updateGUIStatusesView(ipAddress, statusBt, statusSocket, statusHttp);
		}
    };
    
    private void updateGUIStatusesView(String ipAddress, String statusBt, String statusSocket, String statusHttp)
    {
    	TextView tPhoneIp = (TextView) findViewById(R.id.lblStatusPhoneIp);
    	tPhoneIp.setText("" + ipAddress);
    	
    	TextView tBt = (TextView) findViewById(R.id.lblStatusBluetooth);
    	tBt.setText("" + statusBt);
    	
    	TextView tSock = (TextView) findViewById(R.id.lblStatusSocket);
    	tSock.setText("" + statusSocket);
    	
    	TextView tHttp = (TextView) findViewById(R.id.lblStatusHttp);
    	tHttp.setText("" + statusHttp);
    }
}